using System;
using System.Collections.Generic;
using BillsDomain;
using System.ComponentModel;

namespace BillsPresentation
{
    /// <summary>
    /// Describes the payment reminder screen
    /// </summary>
    public interface IPaymentReminderView : IView
    {
        /// <summary>
        /// Gets or sets the list of days and their balances.
        /// </summary>
        /// <value>The days and balances.</value>
        BindingList<CalendarDay> DaysAndBalances { get; set; }

        /// <summary>
        /// Gets or sets the list of upcoming payments.
        /// </summary>
        /// <value>The upcoming payments.</value>
        UpcomingPaymentsCollection UpcomingPayments { get; set; }

        /// <summary>
        /// Gets or sets the first date to consider when generating the upcoming payment list and the projected balance.
        /// </summary>
        /// <value>As of day.</value>
        DateTime AsOfDay { get; set; }

        /// <summary>
        /// Occurs when the as of date is changed.
        /// </summary>
        event EventHandler AsOfDateChanged;

        /// <summary>
        /// Occurs when a scheduled payment is changed or added.
        /// </summary>
        event EventHandler<ScheduledPaymentChangedEventArgs> ScheduledPaymentChanged;

        /// <summary>
        /// Occurs when the delete button is clicked.
        /// </summary>
        event EventHandler DeleteClicked;

        /// <summary>
        /// Occurs when the an item used to calculate the projected balance is changed.
        /// </summary>
        event EventHandler ProjectedBalanceItemsChanged;

        /// <summary>
        /// Gets the current balance.
        /// </summary>
        /// <value>The current balance.</value>
        decimal? CurrentBalance { get; }

        /// <summary>
        /// Gets or sets the projected balance.
        /// </summary>
        /// <value>The projected balance.</value>
        string ProjectedBalance { get; set; }

        /// <summary>
        /// Gets the date for balance projection.
        /// </summary>
        /// <value>The date for projection.</value>
        DateTime DateForProjection { get; set;  }

        /// <summary>
        /// Gets or sets the list of dates with payments.
        /// </summary>
        /// <value>The dates with payments.</value>
        BindingList<CalendarDay> DatesWithPayments { get; set; }

        /// <summary>
        /// Occurs when a specific date on the calendar of days with payments is selected.
        /// </summary>
        event EventHandler<DateSelectedEventArgs> SpecificDateSelected;

        /// <summary>
        /// Gets or sets the list of payments for a specific day.
        /// </summary>
        /// <value>The payments for A day.</value>
        IList<Payment> PaymentsForADay { get; set; }

        /// <summary>
        /// Gets or sets the day on calendar.
        /// </summary>
        /// <value>The day on calendar.</value>
        DateTime DayOnCalendar { get; set; }

        string PathToData { get; set; }

        string DataFileName { get; set; }

        event EventHandler DataExporting;

        event EventHandler DataImporting;
    }
}
